package cn.vendsystem.com.consumer;


import cn.vendsystem.com.service.LoginLogService;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.vendcommon.com.config.RabbitConfig;
import cn.vendcommon.com.entity.LoginLog;

import java.io.IOException;

@Component
public class LoginLogConsumer {

    private final Logger logger = LoggerFactory.getLogger(LoginLogConsumer.class);

    @Autowired
    private LoginLogService loginLogService;

    /**
     * 使用 containerFactory="rabbitListenerContainerFactory" 以支持手动 ack。
     * 参数 LoginLog 会由 Jackson2JsonMessageConverter 反序列化。
     */
    @RabbitListener(queues = RabbitConfig.LOGIN_QUEUE, containerFactory = "rabbitListenerContainerFactory")
    public void onMessage(LoginLog loginLog, Message message, Channel channel) {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            if (loginLog == null) {
                logger.warn("接收到空的 LoginLog，直接 ack");
                channel.basicAck(deliveryTag, false);
                return;
            }

            // 保存事务日志
            loginLogService.save(loginLog);

            // 成功确认
            channel.basicAck(deliveryTag, false);
        } catch (Exception ex) {
            logger.error("处理 LoginLog 失败，deliveryTag={}", deliveryTag, ex);

            try {
                // 如果要重试回队列：basicNack(deliveryTag, false, true)
                // 这里示例为不重新入队，直接丢到死信（根据你的队列 DLX 配置）
                channel.basicNack(deliveryTag, false, false);
            } catch (IOException ioEx) {
                logger.error("basicNack 失败", ioEx);
            }
        }
    }
}
